import java.util.Stack;


public class ComponenteConexe 
{
	private GrafOrientat graf;
	
	public ComponenteConexe(GrafOrientat graf) 
	{
		this.graf=graf;
	}
	
	public static int test(boolean [] viz)
	{
		for(int i=0;i<viz.length;i++)
			if(viz[i] == false)
				return i;
		return -1;
	}
	
	public String [] getComponenteConexe()
	{
		int p=1;
		boolean [] viz = new boolean [graf.getNrVarfuri()];
		Stack <Integer> q = new Stack <Integer>();
		viz[0] = true;
		q.add(0);
		String [] s = new String[100];
		for(int i=0;i<100;i++)
			s[i] = new String("");
		s[1]+=" 0";
		
		while(test(viz) != -1)
		{	
			while(!q.isEmpty())
			{
				int aux = q.peek();
				boolean ok = false;
				
				for(int i=0; i < graf.getNrElem(aux) ;i++)
					if(viz[graf.getListaAd(aux).get(i)] == false)
					{
						q.add(graf.getListaAd(aux).get(i));
						viz[graf.getListaAd(aux).get(i)] = true;
						ok = true;
						s[p]+=" ";
						s[p]+=String.valueOf(graf.getListaAd(aux).get(i));
						break;
					}
				if(ok ==  false)
					q.pop();
			}
			if(test(viz) != -1)
			{
				int poz=test(viz);
				q.add(poz);
				viz[poz] = true;
				p++;
				s[p]=s[p]+" "+String.valueOf(poz);
			}
		}
		s[0] = String.valueOf(p);
		return s;
	}
}
